package me.zhengjie.tool;
import cn.hutool.cache.CacheUtil;
import cn.hutool.cache.impl.LFUCache;
import cn.hutool.cache.impl.TimedCache;
import cn.hutool.core.date.DateUnit;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * 本地缓存工具
 * LFU(least frequently used) 最少使用率策略。根据使用次数来判定对象是否被持续缓存（使用率是通过访问次数计算），当缓存满时清理过期对象，清理后依旧满的情况下清除最少访问（访问计数最小）的对象并将其他对象的访问数减去这个最小访问数，以便新对象进入后可以公平计数
 */
public class LocalCacheUtil {

    private static final Logger logger = LoggerFactory.getLogger(LocalCacheUtil.class);

        /**
         * 全局共享，直接使用
         */
        public static LFUCache<String, String> lfuCache = CacheUtil.newLFUCache(100);

        /**
         * 默认缓存时长 单位s 30天
         */
        private static final Long DEFAULT_TIMEOUT =  DateUnit.SECOND.getMillis() * 60 * 60 * 24 * 30;

        /**
         * 默认清理间隔时间 单位s
         */
        private static final Long CLEAN_TIMEOUT = DateUnit.SECOND.getMillis() * 300;

        /**
         * 全局时间超时缓存，构造器启动每秒检测。
         */
        public static TimedCache<String, String> timedCache = CacheUtil.newTimedCache(DEFAULT_TIMEOUT);

        static {
            //启动定时任务,每CLEAN_TIMEOUT秒检查一次过期
            timedCache.schedulePrune(CLEAN_TIMEOUT);
        }

        public static void put(String key, String value) {
            timedCache.put(key, value);
        }

        /**
         *
         * @param key
         * @param value
         * @param expire 过期时间 秒
         */
        public static void put(String key, String value,Integer expire) {
            timedCache.put(key, value, DateUnit.SECOND.getMillis() * expire);
        }

        /**
         * 禁止延迟缓存 isUpdateLastAccess = false
         * @param key
         * @param isUpdateLastAccess
         */
        public static String get(String key, boolean isUpdateLastAccess){
            return timedCache.get(key,isUpdateLastAccess);
        }

        public static String get(String key){
            return get(key,false);
        }

        public static void remove(String key){
            timedCache.remove(key);
        }

        /**
         * 清空所有缓存
         */
        public static void clear(){
            lfuCache.clear();
            timedCache.clear();
        }

}
